package com.zuipin.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import com.zuipin.entity.RocketMqInfo;
import com.zuipin.entity.product.ProductInfo;
import com.zuipin.enums.BusinessType;
import com.zuipin.framework.exception.CustomException;
import com.zuipin.framework.result.PageResult;
import com.zuipin.framework.result.Result;
import com.zuipin.util.Pagination;
import com.zuipin.vo.BackExtProDetailVo;
import com.zuipin.vo.BackProInfoPrice;
import com.zuipin.vo.BackProductInfoDetailVo;
import com.zuipin.vo.BackProductInfoVo;
import com.zuipin.vo.BackProductPlatformSearchVo;
import com.zuipin.vo.HotReviewProVo;
import com.zuipin.vo.ProExtDetailVo;
import com.zuipin.vo.ProExtInfoVo;
import com.zuipin.vo.ProExtSerachVo;
import com.zuipin.vo.ProExtVo;
import com.zuipin.vo.ProPriceVo;
import com.zuipin.vo.ProSearchVo;
import com.zuipin.vo.ProVo;
import com.zuipin.vo.ProductAmountVo;
import com.zuipin.vo.ProductCashierVo;
import com.zuipin.vo.ProductInfoVo;
import com.zuipin.vo.ProductPropertyValueVo;
import com.zuipin.vo.ProductSearchVo;
import com.zuipin.vo.SearchProductInfoVo;

import net.sf.json.JSONObject;

/**
 * 商品信息业务类
 *
 * @ClassName IProductInfoService
 * @author wangcongyi
 * @date 2017年4月19日 下午7:07:01
 */
public interface IProductInfoService {
	
	// 获取商品信息（SKU、名称、价格）并分页
	public List<ProVo> findPro(JSONObject object, Pagination page);
	
	// 获取商品信息（属性信息、属性值信息、商品相册、商品扩展信息、商品价格、商品详情）
	public ProductInfoVo getProExtInfo(JSONObject object, boolean isLogin);
	
	// 获取商品信息通过商品SKU
	public ProductInfo selectByProSku(String proSku);
	
	// 获取商品信息和价格通过商品SKU
	public Map<String, Object> getByProSku(String proSku);
	
	// 获取商品信息列表通过商品SKU或商品拓展ID
	public List<ProExtInfoVo> queryProExtInfo(ProExtSerachVo ProExt, boolean isLogin);
	
	// 根据关键字等字段自动分页查询商品信息
	public List<ProExtVo> seachProduct(ProSearchVo pro, Pagination page);
	
	// 根据关键字等字段手动分页查询商品信息
	public List<ProExtVo> seachProduct(ProSearchVo pro, JSONObject obj);
	
	// 根据关键字等字段查询总共条数
	public Integer getTotalRecord(ProSearchVo pro);
	
	// 获取商品信息通过商品外部编码
	public ProductInfo selectByProNo(String proNo);
	
	public ProductInfo selectByProductProSku(String proSku);
	
	// 通过商品ID获取商品信息
	public ProductInfo selectById(Long id);
	
	// 通过商品SKU获取商品信息
	public ProductInfo getProBySku(String sku);
	
	// 通过商品SKU查找商品信息详情（商品基础信息、商品属性-属性值列表）
	public ProExtDetailVo selectProForGeneral(JSONObject params);
	
	// 通过商品SKU查找商品信息详情（商品基础信息、商品拓展信息、商品属性-属性值列表、商品价格）
	public ProExtDetailVo selectProDetail(JSONObject params) throws CustomException;
	
	// 根据商品SKU修改商品销售数
	public boolean updateSalesByProSku(String proSku, BigDecimal salesNum);
	
	// 校验商品SKU ID 编码 唯一性
	public List<ProductInfo> checkPro(JSONObject params);
	
	// 添加商品信息
	public boolean insertSelective(ProductInfo record);
	
	// 添加体验品 价格信息
	public boolean insertXpPro(ProductInfo productInfo, ProPriceVo price);
	
	// 修改商品信息 商品属性值
	public boolean updatePro(ProductInfo productInfo, ProductPropertyValueVo prop);
	
	// 修改商品信息
	public boolean updateByPrimaryKeySelective(ProductInfo record);
	
	// 后台分页查询商品信息（通用）
	public List<ProductInfo> findProduct(ProductSearchVo search, Pagination page);
	
	// 商品分类树查找商品信息列表（通用）
	public List<ProductInfo> findProductByCatId(ProductSearchVo search, Pagination page);
	
	// 后台分页查询商品信息（分系统）
	public List<ProductInfo> findProductExt(ProductSearchVo search, Pagination page);
	
	// 商品分类树查找商品信息列表（分系统）
	public List<ProductInfo> findProductExtByCatId(ProductSearchVo search, Pagination page);
	
	// 根据商品信息ID和启用禁用状态 查询是否存在
	public ProductInfo isExists(JSONObject params);
	
	// 更新商品启用禁用状态
	public boolean modifyStatus(JSONObject params);
	
	// 通过商品SKU获取有效库存
	public Map<String, Map<String, Object>> getStock(String proSku) throws CustomException;
	
	public int deleteByPrimaryKey(Long id);
	
	public int insert(ProductInfo record);
	
	public BackProductInfoDetailVo findProductInfoDetail(Long proId);
	
	public int updateByPrimaryKey(ProductInfo record);
	
	// 根据商品编号查询商品信息 <KEY:VALUE> key:商品编号
	public Map<String, ProExtInfoVo> queryProExtInfo(ProExtSerachVo ProExt);
	
	// 根据商品编号批量查询商品信息 醉品分销使用 返回 sku, productType 品类,brand 品牌, type类别
	public Map<String, Map<String, Object>> queryProInfoType(List<String> skuList);
	
	/**
	 * 后台查询商品
	 * 
	 * @Title: searchBySkuFromBack 
	 * @author: wuyicheng
	 * @date: 2017年6月16日上午11:26:37 
	 * @param memberId 会员ID
	 * @param sysId 系统ID
	 * @param proSku 商品SKU
	 * @param proNum 商品数量
	 * @param device 平台PC|WAP
	 * @throws CustomException 
	 * @return
	 * @return: Result<ProductAmountVo>
	 * @throws 
	 */
	public Result<ProductAmountVo> searchBySkuFromBack(Long memberId, Long sysId, String proSku, BigDecimal proNum, String device) throws CustomException;
	
	// 判断是否为积分商品
	ProductInfo isIntegralPro(String sku);
	
	/**
	 * 后台商品编号查询商品详细信息-添加平台商品时使用
	 * @param proNo
	 * @return
	 */
	public Result<BackExtProDetailVo> searchProDetail(Long sysId, String proNo);
	
	PageResult<List<BackProductInfoVo>> findBackProductInfo(BackProductPlatformSearchVo search, Pagination page);
	
	/** 
	 * 同步商品
	 * 
	 * @Title: sendProductInfoToErp 
	 * @author: wuyicheng
	 * @date: 2017年8月11日下午3:01:35 
	 * @param data 数据
	 * @param tag 发送的标题
	 * @return: void
	 * @throws 
	 */
	void sendProductInfoToErp(String data, String tag);
	
	public BackExtProDetailVo seachProInfoPart(ProductInfo productInfo, Long sysId, String proNo);
	
	public Result<BackProductInfoDetailVo> findBackProductInfoDetail(Long proId);
	
	public HotReviewProVo getHotReviewProVo(String proSku);
	
	public HotReviewProVo getHotReviewProVo(Long id);
	
	public void insertProPrice(Long proId, List<BackProInfoPrice> proInfoPrices, boolean isExchangeInt, BusinessType businessType, Long updateId) throws CustomException;
	
	/**
	 * 后台新建通用SKU
	 */
	public Result insertProductInfo(BackProductInfoDetailVo proInfoDetail) throws CustomException;
	
	public Result updateProductInfo(BackProductInfoDetailVo proInfoDetail) throws CustomException;
	
	/**
	 * 添加体验品
	 */
	public Result creatExperiencePro(BackProductInfoDetailVo experiencePro, Long proId) throws CustomException;
	
	/**
	 * 修改体验品
	 */
	public Result updateExperiencePro(BackProductInfoDetailVo experiencePro) throws CustomException;
	
	/**
	 * 查询出商品列表，品牌，分类信息
	 *
	 * @Title: searchProductInfo 
	 * @author: wuyicheng
	 * @date: 2017年9月11日下午12:59:42 
	 * @param sysId 系统ID
	 * @param productSku 商品SKU
	 * @param ignoreProSkus 忽略商品SKU
	 * @param categoryId 分类ID
	 * @param brandId 品牌ID
	 * @param productPriceId 代理商等级对应的价格ID
	 * @param isIgnoreNoPurchasePrice 是否忽略没有代理价的商品
	 * @param pageNumber 页码
	 * @param pageSize 数量
	 * @param sort 排序字段名
	 * @param order 升序降序
	 * @return
	 * @throws CustomException
	 * @return: Result<SearchProductInfoVo>
	 * @throws
	 */
	public Result<SearchProductInfoVo> searchProductInfo(Long sysId, String productSku, String ignoreProSkus, Long categoryId, Long brandId, Long productPriceId,
			Short ignoreNoPurchasePrice, Integer pageNumber, Integer pageSize, String sort, String order) throws CustomException;
	
	/** 
	 *
	 * @Title: findProductByCashier 
	 * @author: wuyicheng
	 * @date: 2017年8月21日下午3:24:31 
	 * @param productSearchVo
	 * @param page
	 * @return
	 * @throws CustomException
	 * @return: List<ProductCashierVo>
	 * @throws 
	 */
	List<ProductCashierVo> findProductByCashier(ProductSearchVo productSearchVo, Pagination page) throws CustomException;
	
	public ProductInfo findProById(Long id);
	
	/**
	 * 
	 * @Title: updateProductErpId 
	 * @Description: 修改erpId
	 * @author xjd
	 * @param @param mqInfo
	 * @return void
	 * @throws
	 */
	public void updateProductErpId(RocketMqInfo mqInfo);
	
	public ProductInfo findProductInfoById(Long id);
	
	List<Long> findIdByName(String proName);
}
